package com.itheima.d3_synchronized_code.explain;

/**
 * @Author :
 * @Date : 2023/3/10 10:00
 * @Description :账户类
 */
public class Account {
    private String accountId;  //账户id
    private Double money;  //余额

    public Account() {
    }

    /**
     * 全参构造器
     * @param accountId 账户id
     * @param money     余额
     */
    public Account(String accountId, Double money) {
        this.accountId = accountId;
        this.money = money;
    }

    public String getAccountId() {
        return accountId;
    }

    public void setAccountId(String accountId) {
        this.accountId = accountId;
    }

    public Double getMoney() {
        return money;
    }

    public void setMoney(Double money) {
        this.money = money;
    }

    /**
     * 加锁方式1
     * @param money
     * 同步代码块
     */
/*    public void drawMoney(double money) {
        // 同步代码块  synchronized 锁  以下代码一次只能一个线程执行
        //非静态同步方法： 锁对象用this    就是调用方法的对象
        synchronized (this) {
            //1. 判断余额是否充足
            if (this.money >= money) {
                //2. 余额充足 取款成功
                System.out.println(Thread.currentThread().getName() + "取款成功");
                //3. 修改金额
                this.money -= money;
                System.out.println("账户余额 = " + this.money);
            }else{
                //4. 否则余额不足
                System.out.println("余额不足,取款失败...");
            }
        }
    }*/

    /**
     * 加锁方式2
     * @param money
     * 同步方法  synchronized 写在方法的返回值前面； 整个方法里的所有代码都锁起来了。
     */
    public synchronized void drawMoney(double money) {
            //1. 判断余额是否充足
            if (this.money >= money) {
                //2. 余额充足 取款成功
                System.out.println(Thread.currentThread().getName() + "取款成功");
                //3. 修改金额
                this.money -= money;
                System.out.println("账户余额 = " + this.money);
            }else{
                //4. 否则余额不足
                System.out.println("余额不足,取款失败...");
        }
    }
}
